- R language (R Core Team (2022)
- Main article (Adams et al. (2019)
- Rmarkdown (Allaire et al. (2021)
- GSEA (Subramanian et al. (2005)
- Bader gene set (R. A. S. Merico Daniele AND
Isserlin (2010)
- Hepatitis Article (Kamiza et al.
(2022)
- Cytoscape (Shannon et al. (2003)
- GeneMania (Zuberi et al. (2013))
- p53 (Aloni-Grinstein et al.
(2018))
- Sialic&cancer (Zhou, Yang, and Guan
(2020))
- Reactome (Gillespie et al.
(2021))
- Sialytion (Munkley and Scott
(2019))
- Drugbank (Wishart et al. (2006))
- EnrichmentMap (D. Merico et al.
(2010))
- AutoAnnotte (Kucera et al.
(2016))
if (!requireNamespace("GSA", quietly = TRUE)){
install.packages("GSA")}
if (!requireNamespace("kable", quietly = TRUE)){
install.packages("kable")}
Introduction: Assignment 1 & Assignment 2
My dataset from GEO (Gene Expression Omnibus) is GSE131222 of
Transcriptional control of sub-type switching ensures adaptation and
growth of pancreatic cancer. My gene set aims to see the underlying
ectopic expression of GLI2 expression in human pancreatic cancer cell
lines specifically looking at YAPC cells. Moreover, 1 ug/ml of Dox
treatment allowed for over expression analysis of GLI2 by measuring via
RNA-seq. on Illumina hiseq 2000. The authors used TopHat and Cufflinks
for quality control and later used qRT-PCR along with SYBR Green assays
to measure the intensity. By concluding oncogene genes and detecting
induced-higher expression values compare to expression values 6 days
before, GLI2 regulation of genes associated with basal-like sub-type
switching was detected
Firstly, the data set I obtained from GEO was cleaned and filtered
based on duplication. The normalized values of genes that are mostly
miRNA genes are eliminated from the gene set. There have been instances
that one row of expression has multiple genes associated. This was later
found out on the second assignment where we believe this did not cause
any problem, due to our limited analysis in the first assignment. Later
I analyzed the dispersion among treatments of both triplicate controls
that contain empty plasmid of GLI2 and experiments that contain
inducible GLI2 plasmid! Since there might be a discrepancy among the
gene annotation, which can cause a misunderstanding of our later
analysis, I validated my HUGO gene symbols. Furthermore, by identifying
HUGO symbols that are respective or similar to those that our clean data
set contains. I was able to conclude that my data set is clean, contains
no duplicates as well as ready for the later analyses which are
normalization, differential expression calculation, non-thresholded
& thresholded gene enrichment analyses, fold expression based on the
fitted model of GLI2 expression set, and finally for the enrichment
mapping with post analysis.
Secondly, by preliminary analyzing the differential expression of our
data set via heat map I have concluded that there is a strong difference
between the treatment of GLI2 and the control cells in terms of their
summarized gene expression by the model. Later, by visualizing the
p-value distribution I concluded most of the oncogenes referred on the
main article are clustered at the specified p-value interval. Later
sample clustering summarized the gene expression difference between the
treatment and the control genes. Stringently analyzing Lastly, the
non-thresholded gene enrichment map both allowed me to observe genes
that are passing our permissive FDR values as well as defined the
pathways that are found to be associated with oncogenes. These pathways
are then altered visualized and used to conclude that by doing all the
analysis on assignment 2, I was able to differentiate the genes that are
related to sub-type switching (EMT) and those that are not (non-EMT).
Finally, I have separated two data from each other and obtained a ranked
gene list based additionally. These analyses taught me how to select a
data set, clean a data set, normalize it, analyze to what extent the
genes are expressed differentially from one another, and see how the
genes are interacting genes in a given pathway or a given gene set.
Also, finally, validate the author’s conclusion or come up with my
conclusion and promote further research in the area. In this final
assignment of mine, I will be concluding my analyses with enrichment
mapping by using Cytoscape and its apps as well as conservatively gene
set.
Part 1: Non-thresholded Gene set Enrichment Analysis
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/GSEA.png")

Figure 1 GSEA running on Pre-ranked Gene List
Panel
I have used GSEA (4.3.2) (4) non-thresholded gene set enrichment
method. I have used the Bader Lab gene set of
Human_GOBP_AllPathways_no_GO_iea_March_01_2021_symbol.gmt including no
HUGO symbols and IEA symbols published on March 1, 2021. It was released
in 2023 by Human MiSigDB. I used no collapse to remap gene symbols to
avoid confusion. 200 max gene size and 15 min gene size to have more
stringent values. I used 1000 permutations that allowed for a shorter
running time. Therefore, GSEA resulted in more stringent non-EMT values
that are shown to be enriched. There are pathways of genes that are
known to be involved in apoptosis. This makes sense because, with my
previous results that my log CPM is always negative, there are no
positive log CPM values. This was my previous hypothesis that almost
every gene treated showed higher expression with the treatments the
authors did to induce oncogenic roles.
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/enrichment.png")

Figure 2 GSEA Enrichment Results: GSE results
indicate there are 4703 upregulated gene sets and 38 down regulated gene
sets.
Upregulated
- 12 gene sets < 25% FDR
- 85 gene sets < 1% p-value
- 304 gene sets < 5% nominal p-value
Downregulated
- 4 gene sets < 25 % FDR
- 9 gene sets < 1% p-value
- 9 gene sets < 5% p-value
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/neg.png")

Figure 3 Negative Enrichment Results: The top gene
set for negative is PHOSPHOLIPASES%HUMANCYC%LIPASYN-PWY with 0 FDR and 0
p-value and-0.65 ES.
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/pos.png")

Figure 4 Positive Enrichment Results: The top gene
set at the positive gene set is TRANSCRIPTIONAL REGULATION BY SMALL
RNAS%REACTOME%R-HSA-5578749.3 with 0.784 FDR-value and 0.001 Nominal
p-values and 0.98 ES score.
Comparison of Thresholded vs non-Thresholded
There are pathways of genes that are known to be involved in
apoptosis. This makes sense because, with my previous results that my
log CPM is always negative, there are no positive log CPM values. This
was my previous hypothesis that almost every gene treated showed higher
expression with the treatments the authors did to induce oncogenic
roles.
Most of the pathways are viral infection pathways. Furthermore, some
viruses stimulate pancreas cancer and liver cancer as well such as
chronic Hepatitis C and chronic Hepatitis B (6) A significant proportion
of these pathways are systematic disease-causing viruses such as Epstein
Barr virus and HIV-1 virus. The negative results contain more oncogenic
pathways such that the apoptosis and sialic acid synthesis gene sets are
more prevalent as opposed to positive. There is the separation of
oncogenic pathways between positive and negative. The second assignment
gene enrichment results were more clear in terms of gene pathway role.
The difference between EMT genes vs non-EMT genes is more apparent in
the thresholded analysis. the gene enrichment results in the
non-thresholded analysis are more scarce and do not give significantly
enriched results. Even though my parameters are stringent, I am not
getting pathways that are adequate in terms of their role.
Finally, the quantitative difference between the thresholded and the
non-thresholded is the the thresholded analysis has 771 downregulated
genes sets that are less than 0.001 p value and there are 1128
upregulated gene sets. The difference between non-threholded and
thresholded is high as 4703 upregualted genes (non-thresholded) - 1128
upregulated genes (thresholded) = 3575 gene sets. The downregualted gene
set difference is more substantial (733) genesets more in thresholded
analysis.
Part 2: Visualize your Gene set Enrichment Analysis in
Cytoscape
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/pathway.png")

Figure 5 Preliminary Cytoscape Pathway Enrichment
Visualization: Both apoptotic and viral gene set are separated
from each other. Mesenchymal apoptotic gene sets are apparent. Both
upregualted (Red) and downregualted (Blue) gene sets are observed. This
includes the whole enrichment map.
The enrichment map Cytoscape visualization was done by using
stringent 0.05 p-value and ver permissive 0.5 FDR values (7) The reason
why I used 0.5 for FDR is that. Furthermore, Jaccard + Overlap
coefficient 0.375 and combined coefficient 0.5 were used. In total there
are 291 nodes (including hidden) and 763 edges (including hidden edges)
in the visualization. There are more gene sets that I find to be
associated with each other.
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/publication.png")

Figure 6 Publication Ready Annotation Figure of Gene
Enrichment visualization (7): By annotating and analyzing in
terms of positivity and negativity the enrichment visualization showed
up regulated gene sets to be collapsed in viral export RNA theme. Most
of the down regulated are not associated with one another.
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/parameters.png")

Figure 7 Annotation parameters: The Default
parameters are used due to small visualization and for proper
observation. The annotations fit the model as there is strong evidence
of the previous connections among cancer and viral genes indicated.
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/cluster.png")

Figure 8 (Extra!)Publication ready figure of Gene Enrichment
visualization: Collapsed themes indicate that there is indeed
relationship between abortive viral RNA gene sets and the export viral
RNA gene set.
Apoptotic gene sets are related to those of viral infection gene
sets. This supports the presence of viral effects on pancreas cancer as
well as many other cancer types. I created the publication-ready figure
by using default parameters of MCL cluster 3 max word per label, minimum
word occurrence of 1, and adjacent word bonus of 8 with WordCloud label
algorithm. By collapsing the enrichment map I found 24 major themes on
my map. I do not observe any novel pathways that appeared after total
collapsing.
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/sapiens.png")

NA
Figure 9 (Extra!) GeneMania gene enrichment pathway results.
Most of the genes are virus related(8)
The complete gene set GeneMania analysis to see if the genes in
the respective pathways on the enrichment map are associated. I noted
viral genes mostly. The noted node types
Genemania <- read.csv(file=file.path(getwd(),"data","table_genemania.csv"))
knitr::kable(Genemania, type="html")
| 0.0000 |
NUP50 |
-0.4593206 |
H__sapiens__1_-774733 |
query |
NUP50 |
0.6317127 |
H__sapiens__1_-774733 |
| 0.0000 |
NUP205 |
-0.3864459 |
H__sapiens__1_-782635 |
query |
NUP205 |
0.6794675 |
H__sapiens__1_-782635 |
| 0.0000 |
RANBP2 |
-0.6944706 |
H__sapiens__1_-782386 |
query |
RANBP2 |
0.4993387 |
H__sapiens__1_-782386 |
| 0.0000 |
TPR |
-0.4513919 |
H__sapiens__1_-773361 |
query |
TPR |
0.6367412 |
H__sapiens__1_-773361 |
| 0.0000 |
POM121 |
-0.3202072 |
H__sapiens__1_-789815 |
query |
POM121 |
0.7259986 |
H__sapiens__1_-789815 |
| 0.0000 |
NUP88 |
-0.4133439 |
H__sapiens__1_-776294 |
query |
NUP88 |
0.6614348 |
H__sapiens__1_-776294 |
| 0.0000 |
NUP188 |
-0.4694928 |
H__sapiens__1_-774764 |
query |
NUP188 |
0.6253193 |
H__sapiens__1_-774764 |
| 0.0000 |
NUP133 |
-0.4971920 |
H__sapiens__1_-773810 |
query |
NUP133 |
0.6082362 |
H__sapiens__1_-773810 |
| 0.0000 |
RAE1 |
-0.5025908 |
H__sapiens__1_-775191 |
query |
RAE1 |
0.6049613 |
H__sapiens__1_-775191 |
| 35.8284 |
NUP160 |
-0.4609759 |
H__sapiens__1_-773223 |
query |
NUP160 |
0.6306679 |
H__sapiens__1_-773223 |
| 0.0000 |
NUP155 |
-0.4669676 |
H__sapiens__1_-776946 |
query |
NUP155 |
0.6269004 |
H__sapiens__1_-776946 |
| 0.0000 |
NUP54 |
-0.4274837 |
H__sapiens__1_-780479 |
query |
NUP54 |
0.6521480 |
H__sapiens__1_-780479 |
| 0.0000 |
NUP153 |
-0.5116202 |
H__sapiens__1_-778335 |
query |
NUP153 |
0.5995235 |
H__sapiens__1_-778335 |
| 0.0000 |
NUP214 |
-0.5148612 |
H__sapiens__1_-778618 |
query |
NUP214 |
0.5975835 |
H__sapiens__1_-778618 |
| 0.0000 |
SEC13 |
-0.5645876 |
H__sapiens__1_-782804 |
query |
SEC13 |
0.5685946 |
H__sapiens__1_-782804 |
| 0.0000 |
NDC1 |
-0.1134623 |
H__sapiens__1_-773535 |
query |
NDC1 |
0.8927378 |
H__sapiens__1_-773535 |
| 0.0000 |
NUP37 |
-0.4418337 |
H__sapiens__1_-774031 |
query |
NUP37 |
0.6428565 |
H__sapiens__1_-774031 |
| 0.0000 |
AAAS |
-0.3917891 |
H__sapiens__1_-774750 |
query |
AAAS |
0.6758466 |
H__sapiens__1_-774750 |
| 0.0000 |
NUP85 |
-0.4620475 |
H__sapiens__1_-778398 |
query |
NUP85 |
0.6299924 |
H__sapiens__1_-778398 |
| 0.0000 |
NUP43 |
-0.4713705 |
H__sapiens__1_-777773 |
query |
NUP43 |
0.6241463 |
H__sapiens__1_-777773 |
| 0.0000 |
NUP107 |
-0.5350951 |
H__sapiens__1_-776652 |
query |
NUP107 |
0.5856136 |
H__sapiens__1_-776652 |
| 0.0000 |
NUP93 |
-0.4014051 |
H__sapiens__1_-775466 |
query |
NUP93 |
0.6693788 |
H__sapiens__1_-775466 |
| 0.0000 |
NUP210 |
-0.3976326 |
H__sapiens__1_-779292 |
query |
NUP210 |
0.6719089 |
H__sapiens__1_-779292 |
| 0.0000 |
NUP35 |
-0.3966731 |
H__sapiens__1_-783644 |
query |
NUP35 |
0.6725539 |
H__sapiens__1_-783644 |
| 0.0000 |
NUP62 |
-0.4904854 |
H__sapiens__1_-795021 |
query |
NUP62 |
0.6123291 |
H__sapiens__1_-795021 |
| 0.0000 |
POM121C |
-0.0841121 |
H__sapiens__1_-826631 |
query |
POM121C |
0.9193282 |
H__sapiens__1_-826631 |
Part 3: Post Analysis Summary
library(GSA)
gmt_file <- file.path(getwd(),"data",
"Human_GOBP_AllPathways_no_GO_iea_March_01_2021_symbol.gmt")
capture.output(genesets <-
GSA.read.gmt(gmt_file),file="GSA_file.txt")
Read 18727 records
Read 1270620 items
names(genesets$genesets) <- genesets$geneset.names
knitr::kable(head(genesets$geneset.names), type="html")
| PROTEIN CITRULLINATION%HUMANCYC%PWY-4921 |
| METHYLGLYOXAL DEGRADATION III%HUMANCYC%PWY-5453 |
| STEARATE BIOSYNTHESIS I
(ANIMALS)%HUMANCYC%PWY-5972 |
| TRYPTOPHAN DEGRADATION X (MAMMALIAN, VIA
TRYPTAMINE)%HUMANCYC%PWY-6307 |
| CERAMIDE BIOSYNTHESIS%HUMANCYC%PWY3DJ-12 |
| L-SERINE DEGRADATION%HUMANCYC%SERDEG-PWY |
NA
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/p53.png")

Figure 10 (Extra!) Signature gene set p53 against all gene
sets enriched: Post analysis coefficient of 0.25 Mann-Whitney
cut-off (Two-sided) was used. Post-analysis results also show that p63
is mainly involved in reactive oxygen species (ROS) metabolism. ROS are
known to be tumour growth promoters which then cause EMT in different
human tissues as well as trigger cancer of different type.
The post analysis includes the signature gene set from Bader
gene sets (5) of Human symbols of Drugbank approved gene set. p53 is an
oncogene and it is involved in many pathways that are known to be
causing different types of cancers. P53 is associated with viral
pathways as well as some oncogenic pathways. Therefore, it is safe to
assume that the viral effect on oncogenic genes for triggering tumours
is indeed true.
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/NANS.png")

Figure 11 NANS (encircled red) Sialic Acid pathway of Homo
sapiens(11)
The sialic acid pathway is one of the pathways that is known to be
affecting tumor proliferation, cell growth, cell detachment and as a
result metastasis. It is known to be highly expressed by the cancer
cell. Moreover, cancer-triggered apoptosis is one of the results of
sialic acid. Neu5Ac 9-phosphate synthase (NANS)( encircled red) is an
enzyme in sialic acid metabolism.NANS’ role in sialic acid pathways on
the figure. Also, glycolipid-bound sialic acids are highly found in
cancer cells. Finally, by having high expression levels and visualized
on the pathway analysis NANS has the potential to be an oncogene. The
role of sialic acid differs as there is an interaction between cancer
genes and the viral genes, I do hypothesize that cancer causing viruses
are an important factor in high sialic acid levels in pancreas
cancer.
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/sialicacid.jpg")

Figure 12 Oncogenic role of Sialic acid Metabolism
(10)
Part 4: Interpretation and detailed view of results
1.Do the enrichment results support conclusions or mechanism
discussed in the original paper? How do these results differ from the
results you got from Assignment 2 thresholded methods ?
Yes, the enrichment results support the conclusion. It not only
supports the conclusion of EMT genes that are known to be unregulated
and found on the positive side of the gene enrichment analysis but also
a finding of viral effect. This viral effect on different types of
cancer has been discussed in different literature. However, the cancer
oncogene p53 has a relationship with oncogenic viral cancer-inducing
genes. Further research is required to illustrate both pancreas cancer
and much other cancer. The results that we obtained from the thresholded
analysis are partly different from what we obtained from the
non-thresholded analysis. I am confident that this is due to the
gene-set difference as well as experimental errors in data analysis.
However, we were lucky to get partial positive results and conclude
similarly to the main paper’s conclusion.
2.Can you find evidence, i.e. publications, to support some of the
results that you see. How does this evidence support your result ?
- discusses p53 manipulation by oncogenic viruses and shows a clear
picture of possible non-oncogenic viruses. my analysis results showed
clear indications of HIV, E1b(Ebstein Barr virus) effect on cell
apoptosis. Also, cellular degradation pathways are partially visualized
on my enrichment map. They are also associated with viral metabolic
activity such as HIV (shown on the degradation side)(9) Viral activity
is then assocaited with sialic acid as this paper discusses and mentions
the virus effect on cancer (12)
Conclusion
In the third part of the assignment the post-analysis of the GSEA
results allowed to see the direct interaction between different viral
cancerous genes. This paves a path for further research in viral effect
on the pancreas cancer, by strengthening the conclusion that the authors
made. The results from g:Profile and the GSEA correlate in a way that
both of these analysis do have similar numbers of genes lower than 1%
p-value. This makes sense because both of these analysis indicate the
conclusion of hidden viral genes that the author did not show in their
analysis.
knitr::include_graphics("/Users/mac/Desktop/BCB420/A3_MetyuMelkonyan/images/cancer.jpeg")

Figure 13: Oncogenic role of Sialic acid
Metabolism(9)
Reference
Adams, Christina R, Htet Htwe Htwe, Timothy Marsh, Aprilgate L Wang,
Megan L Montoya, Lakshmipriya Subbaraj, Aaron D Tward, Nabeel Bardeesy,
and Rushika M Perera. 2019. “Transcriptional Control of Subtype
Switching Ensures Adaptation and Growth of Pancreatic Cancer.”
Elife 8: e45313.
Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin
Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, Winston Chang, and
Richard Iannone. 2021.
rmarkdown: Dynamic
Documents for R.
https://github.com/rstudio/rmarkdown.
Aloni-Grinstein, Ronit, Meital Charni-Natan, Hilla Solomon, and Varda
Rotter. 2018.
“P53 and the Viral Connection: Back into the Future
‡.” Cancers 10 (6).
https://doi.org/10.3390/cancers10060178.
Gillespie, Marc, Bijay Jassal, Ralf Stephan, Marija Milacic, Karen
Rothfels, Andrea Senff-Ribeiro, Johannes Griss, et al. 2021.
“The reactome pathway knowledgebase
2022.” Nucleic Acids Research 50 (D1): D687–92.
https://doi.org/10.1093/nar/gkab1028.
Kamiza, Abram Bunya, Segun Fatumo, Mwiza Gideon Singini, Chih-Ching Yeh,
and Tinashe Chikowore. 2022. “Hepatitis B Infection
Is Causally Associated with Extrahepatic Cancers: A Mendelian
Randomization Study.” EBioMedicine 79 (April): 104003.
Kucera, Mike, Ruth Isserlin, Arkady Arkhangorodsky, and Gary D Bader.
2016.
“AutoAnnotate: A Cytoscape App for Summarizing Networks with
Semantic Annotations.” F1000Research 5: 1717.
https://doi.org/10.12688/f1000research.9090.1.
Merico, Daniele, Ruth Isserlin, Oliver Stueker, Andrew Emili, and Gary D
Bader. 2010. “Enrichment Map: A Network-Based Method for Gene-Set
Enrichment Visualization and Interpretation.” PLoS One 5
(11): e13984.
Merico, Ruth AND Stueker, Daniele AND Isserlin. 2010.
“Enrichment
Map: A Network-Based Method for Gene-Set Enrichment Visualization and
Interpretation.” PLOS ONE 5 (11): 1–12.
https://doi.org/10.1371/journal.pone.0013984.
Munkley, Jennifer, and Emma Scott. 2019. “Targeting Aberrant
Sialylation to Treat Cancer.” Medicines (Basel) 6 (4).
R Core Team. 2022.
R: A Language and Environment for Statistical
Computing. Vienna, Austria: R Foundation for Statistical Computing.
https://www.R-project.org/.
Shannon, Paul, Andrew Markiel, Owen Ozier, Nitin S Baliga, Jonathan T
Wang, Daniel Ramage, Nada Amin, Benno Schwikowski, and Trey Ideker.
2003. “Cytoscape: A Software Environment for Integrated Models of
Biomolecular Interaction Networks.” Genome Res 13 (11):
2498–2504.
Subramanian, Aravind, Pablo Tamayo, Vamsi K. Mootha, Sayan Mukherjee,
Benjamin L. Ebert, Michael A. Gillette, Amanda Paulovich, et al. 2005.
“Gene Set Enrichment Analysis: A Knowledge-Based Approach for
Interpreting Genome-Wide Expression Profiles.” Proceedings of
the National Academy of Sciences 102 (43): 15545–50.
https://doi.org/10.1073/pnas.0506580102.
Wishart, David S, Craig Knox, An Chi Guo, Savita Shrivastava, Murtaza
Hassanali, Paul Stothard, Zhan Chang, and Jennifer Woolsey. 2006.
“DrugBank: A Comprehensive Resource for in Silico
Drug Discovery and Exploration.” Nucleic Acids Res 34
(Database issue): D668–72.
Zhou, Xiaoman, Ganglong Yang, and Feng Guan. 2020. “Biological
Functions and Analytical Strategies of Sialic Acids in Tumor.”
Cells 9 (2).
Zuberi, Khalid, Max Franz, Harold Rodriguez, Jason Montojo, Christian
Tannus Lopes, Gary D Bader, and Quaid Morris. 2013.
“GeneMANIA Prediction Server 2013 Update.”
Nucleic Acids Res 41 (Web Server issue): W115–22.
LS0tCnRpdGxlOiAiQXNzaWdubWVudCAzIgphdXRob3I6ICJNZXR5dSBNZWxrb255YW4iCmRhdGU6ICIyMDIzLTAzLTI2IgpiaWJsaW9ncmFwaHk6IEEzLmJpYgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwotLS0KMSkgUiBsYW5ndWFnZSAoQHIKMikgTWFpbiBhcnRpY2xlIChAYWRhbXMyMDE5dHJhbnNjcmlwdGlvbmFsCjMpIFJtYXJrZG93biAoQEFsbGFpcmVfcm1hcmtkb3duX0R5bmFtaWNfRG9jdW1lbnRzXzIwMjEKNCkgR1NFQSAoQGRvaToxMC4xMDczL3BuYXMuMDUwNjU4MDEwMgo1KSBCYWRlciBnZW5lIHNldCAoQDEwLjEzNzEvam91cm5hbC5wb25lLjAwMTM5ODQKNikgSGVwYXRpdGlzIEFydGljbGUgKEBLYW1pemEyMDIyLWRvCjcpIEN5dG9zY2FwZSAoQFNoYW5ub24yMDAzLXVvCjgpIEdlbmVNYW5pYSAoQFp1YmVyaTIwMTMtaXUpCjkpIHA1MyAoQGNhbmNlcnMxMDA2MDE3OCkKMTApIFNpYWxpYyZjYW5jZXIgKEBaaG91MjAyMC1raSkKMTEpIFJlYWN0b21lIChAMTAuMTA5My9uYXIvZ2thYjEwMjgpCjEyKSBTaWFseXRpb24gKEBNdW5rbGV5MjAxOS1vaikKMTMpIERydWdiYW5rIChAV2lzaGFydDIwMDYteGQpCjE0KSBFbnJpY2htZW50TWFwIChATWVyaWNvMjAxMC12ZykKMTUpIEF1dG9Bbm5vdHRlIChAUE1JRCkKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZXZhbD1GQUxTRX0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJHU0EiLCBxdWlldGx5ID0gVFJVRSkpewogIGluc3RhbGwucGFja2FnZXMoIkdTQSIpfQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoImthYmxlIiwgcXVpZXRseSA9IFRSVUUpKXsKICBpbnN0YWxsLnBhY2thZ2VzKCJrYWJsZSIpfQpgYGAKCgojIyBJbnRyb2R1Y3Rpb246IEFzc2lnbm1lbnQgMSAmIEFzc2lnbm1lbnQgMgoKICBNeSBkYXRhc2V0IGZyb20gR0VPIChHZW5lIEV4cHJlc3Npb24gT21uaWJ1cykgaXMgR1NFMTMxMjIyIG9mIFRyYW5zY3JpcHRpb25hbCBjb250cm9sIG9mIHN1Yi10eXBlIHN3aXRjaGluZyBlbnN1cmVzIGFkYXB0YXRpb24gYW5kIGdyb3d0aCBvZiBwYW5jcmVhdGljIGNhbmNlci4gTXkgZ2VuZSBzZXQgYWltcyB0byBzZWUgdGhlIHVuZGVybHlpbmcgZWN0b3BpYyBleHByZXNzaW9uIG9mIEdMSTIgZXhwcmVzc2lvbiBpbiBodW1hbiBwYW5jcmVhdGljIGNhbmNlciBjZWxsIGxpbmVzIHNwZWNpZmljYWxseSBsb29raW5nIGF0IFlBUEMgY2VsbHMuIE1vcmVvdmVyLCAxIHVnL21sIG9mIERveCB0cmVhdG1lbnQgYWxsb3dlZCBmb3Igb3ZlciBleHByZXNzaW9uIGFuYWx5c2lzIG9mIEdMSTIgYnkgbWVhc3VyaW5nIHZpYSBSTkEtc2VxLiBvbiBJbGx1bWluYSBoaXNlcSAyMDAwLiBUaGUgYXV0aG9ycyB1c2VkIFRvcEhhdCBhbmQgQ3VmZmxpbmtzIGZvciBxdWFsaXR5IGNvbnRyb2wgYW5kIGxhdGVyIHVzZWQgcVJULVBDUiBhbG9uZyB3aXRoIFNZQlIgR3JlZW4gYXNzYXlzIHRvIG1lYXN1cmUgdGhlIGludGVuc2l0eS4gQnkgY29uY2x1ZGluZyBvbmNvZ2VuZSBnZW5lcyBhbmQgZGV0ZWN0aW5nIGluZHVjZWQtaGlnaGVyIGV4cHJlc3Npb24gdmFsdWVzIGNvbXBhcmUgdG8gIGV4cHJlc3Npb24gdmFsdWVzIDYgZGF5cyBiZWZvcmUsIEdMSTIgcmVndWxhdGlvbiBvZiBnZW5lcyBhc3NvY2lhdGVkIHdpdGggYmFzYWwtbGlrZSBzdWItdHlwZSBzd2l0Y2hpbmcgd2FzIGRldGVjdGVkCiAgCiAgRmlyc3RseSwgdGhlIGRhdGEgc2V0IEkgb2J0YWluZWQgZnJvbSBHRU8gd2FzIGNsZWFuZWQgYW5kIGZpbHRlcmVkIGJhc2VkIG9uIGR1cGxpY2F0aW9uLiBUaGUgbm9ybWFsaXplZCB2YWx1ZXMgb2YgZ2VuZXMgdGhhdCBhcmUgbW9zdGx5IG1pUk5BIGdlbmVzIGFyZSBlbGltaW5hdGVkIGZyb20gdGhlIGdlbmUgc2V0LiBUaGVyZSBoYXZlIGJlZW4gaW5zdGFuY2VzIHRoYXQgb25lIHJvdyBvZiBleHByZXNzaW9uIGhhcyBtdWx0aXBsZSBnZW5lcyBhc3NvY2lhdGVkLiBUaGlzIHdhcyBsYXRlciBmb3VuZCBvdXQgb24gdGhlIHNlY29uZCBhc3NpZ25tZW50IHdoZXJlIHdlIGJlbGlldmUgdGhpcyBkaWQgbm90IGNhdXNlIGFueSBwcm9ibGVtLCBkdWUgdG8gb3VyIGxpbWl0ZWQgYW5hbHlzaXMgaW4gdGhlIGZpcnN0IGFzc2lnbm1lbnQuIExhdGVyIEkgYW5hbHl6ZWQgdGhlIGRpc3BlcnNpb24gYW1vbmcgdHJlYXRtZW50cyBvZiBib3RoIHRyaXBsaWNhdGUgY29udHJvbHMgdGhhdCBjb250YWluIGVtcHR5IHBsYXNtaWQgb2YgR0xJMiBhbmQgZXhwZXJpbWVudHMgdGhhdCBjb250YWluIGluZHVjaWJsZSBHTEkyIHBsYXNtaWQhIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGEgZGlzY3JlcGFuY3kgYW1vbmcgdGhlIGdlbmUgYW5ub3RhdGlvbiwgd2hpY2ggY2FuIGNhdXNlIGEgbWlzdW5kZXJzdGFuZGluZyBvZiBvdXIgbGF0ZXIgYW5hbHlzaXMsIEkgdmFsaWRhdGVkIG15IEhVR08gZ2VuZSBzeW1ib2xzLiBGdXJ0aGVybW9yZSwgYnkgaWRlbnRpZnlpbmcgSFVHTyBzeW1ib2xzIHRoYXQgYXJlIHJlc3BlY3RpdmUgb3Igc2ltaWxhciB0byB0aG9zZSB0aGF0IG91ciBjbGVhbiBkYXRhIHNldCBjb250YWlucy4gSSB3YXMgYWJsZSB0byBjb25jbHVkZSB0aGF0IG15IGRhdGEgc2V0IGlzIGNsZWFuLCBjb250YWlucyBubyBkdXBsaWNhdGVzIGFzIHdlbGwgYXMgcmVhZHkgZm9yIHRoZSBsYXRlciBhbmFseXNlcyB3aGljaCBhcmUgbm9ybWFsaXphdGlvbiwgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gY2FsY3VsYXRpb24sIG5vbi10aHJlc2hvbGRlZCAmIHRocmVzaG9sZGVkIGdlbmUgZW5yaWNobWVudCBhbmFseXNlcywgZm9sZCBleHByZXNzaW9uIGJhc2VkIG9uIHRoZSBmaXR0ZWQgbW9kZWwgb2YgR0xJMiBleHByZXNzaW9uIHNldCwgYW5kIGZpbmFsbHkgZm9yIHRoZSBlbnJpY2htZW50IG1hcHBpbmcgd2l0aCBwb3N0IGFuYWx5c2lzLgogIAogIFNlY29uZGx5LCBieSBwcmVsaW1pbmFyeSBhbmFseXppbmcgdGhlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIG9mIG91ciBkYXRhIHNldCB2aWEgaGVhdCBtYXAgSSBoYXZlIGNvbmNsdWRlZCB0aGF0IHRoZXJlIGlzIGEgc3Ryb25nIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHJlYXRtZW50IG9mIEdMSTIgYW5kIHRoZSBjb250cm9sIGNlbGxzIGluIHRlcm1zIG9mIHRoZWlyIHN1bW1hcml6ZWQgZ2VuZSBleHByZXNzaW9uIGJ5IHRoZSBtb2RlbC4gTGF0ZXIsIGJ5IHZpc3VhbGl6aW5nIHRoZSBwLXZhbHVlIGRpc3RyaWJ1dGlvbiBJIGNvbmNsdWRlZCBtb3N0IG9mIHRoZSBvbmNvZ2VuZXMgcmVmZXJyZWQgb24gdGhlIG1haW4gYXJ0aWNsZSBhcmUgY2x1c3RlcmVkIGF0IHRoZSBzcGVjaWZpZWQgcC12YWx1ZSBpbnRlcnZhbC4gTGF0ZXIgc2FtcGxlIGNsdXN0ZXJpbmcgc3VtbWFyaXplZCB0aGUgZ2VuZSBleHByZXNzaW9uIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHJlYXRtZW50IGFuZCB0aGUgY29udHJvbCBnZW5lcy4gU3RyaW5nZW50bHkgYW5hbHl6aW5nIExhc3RseSwgdGhlIG5vbi10aHJlc2hvbGRlZCBnZW5lIGVucmljaG1lbnQgbWFwIGJvdGggYWxsb3dlZCBtZSB0byBvYnNlcnZlIGdlbmVzIHRoYXQgYXJlIHBhc3Npbmcgb3VyIHBlcm1pc3NpdmUgRkRSIHZhbHVlcyBhcyB3ZWxsIGFzIGRlZmluZWQgdGhlIHBhdGh3YXlzIHRoYXQgYXJlIGZvdW5kIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBvbmNvZ2VuZXMuIFRoZXNlIHBhdGh3YXlzIGFyZSB0aGVuIGFsdGVyZWQgdmlzdWFsaXplZCBhbmQgdXNlZCB0byBjb25jbHVkZSB0aGF0IGJ5IGRvaW5nIGFsbCB0aGUgYW5hbHlzaXMgb24gYXNzaWdubWVudCAyLCBJIHdhcyBhYmxlIHRvIGRpZmZlcmVudGlhdGUgdGhlIGdlbmVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gc3ViLXR5cGUgc3dpdGNoaW5nIChFTVQpIGFuZCB0aG9zZSB0aGF0IGFyZSBub3QgKG5vbi1FTVQpLiBGaW5hbGx5LCBJIGhhdmUgc2VwYXJhdGVkIHR3byBkYXRhIGZyb20gZWFjaCBvdGhlciBhbmQgb2J0YWluZWQgYSByYW5rZWQgZ2VuZSBsaXN0IGJhc2VkIGFkZGl0aW9uYWxseS4KICBUaGVzZSBhbmFseXNlcyB0YXVnaHQgbWUgaG93IHRvIHNlbGVjdCBhIGRhdGEgc2V0LCBjbGVhbiBhIGRhdGEgc2V0LCBub3JtYWxpemUgaXQsIGFuYWx5emUgdG8gd2hhdCBleHRlbnQgdGhlIGdlbmVzIGFyZSBleHByZXNzZWQgZGlmZmVyZW50aWFsbHkgZnJvbSBvbmUgYW5vdGhlciwgYW5kIHNlZSBob3cgdGhlIGdlbmVzIGFyZSBpbnRlcmFjdGluZyBnZW5lcyBpbiBhIGdpdmVuIHBhdGh3YXkgb3IgYSBnaXZlbiBnZW5lIHNldC4gQWxzbywgZmluYWxseSwgdmFsaWRhdGUgdGhlIGF1dGhvcidzIGNvbmNsdXNpb24gb3IgY29tZSB1cCB3aXRoIG15IGNvbmNsdXNpb24gYW5kIHByb21vdGUgZnVydGhlciByZXNlYXJjaCBpbiB0aGUgYXJlYS4gSW4gdGhpcyBmaW5hbCBhc3NpZ25tZW50IG9mIG1pbmUsIEkgd2lsbCBiZSBjb25jbHVkaW5nIG15IGFuYWx5c2VzIHdpdGggZW5yaWNobWVudCBtYXBwaW5nIGJ5IHVzaW5nIEN5dG9zY2FwZSBhbmQgaXRzIGFwcHMgYXMgd2VsbCBhcyBjb25zZXJ2YXRpdmVseSBnZW5lIHNldC4KCiMjIFBhcnQgMTogTm9uLXRocmVzaG9sZGVkIEdlbmUgc2V0IEVucmljaG1lbnQgQW5hbHlzaXMKCgpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9tYWMvRGVza3RvcC9CQ0I0MjAvQTNfTWV0eXVNZWxrb255YW4vaW1hZ2VzL0dTRUEucG5nIikKYGBgCgoqKkZpZ3VyZSAxIEdTRUEgcnVubmluZyBvbiBQcmUtcmFua2VkIEdlbmUgTGlzdCBQYW5lbCoqCgpJIGhhdmUgdXNlZCBHU0VBICg0LjMuMikgKDQpIG5vbi10aHJlc2hvbGRlZCBnZW5lIHNldCBlbnJpY2htZW50IG1ldGhvZC4gSSBoYXZlIHVzZWQgdGhlIEJhZGVyIExhYiBnZW5lIHNldCBvZiBIdW1hbl9HT0JQX0FsbFBhdGh3YXlzX25vX0dPX2llYV9NYXJjaF8wMV8yMDIxX3N5bWJvbC5nbXQgaW5jbHVkaW5nIG5vIEhVR08gc3ltYm9scyBhbmQgSUVBIHN5bWJvbHMgcHVibGlzaGVkIG9uIE1hcmNoIDEsIDIwMjEuIEl0IHdhcyByZWxlYXNlZCBpbiAyMDIzIGJ5IEh1bWFuIE1pU2lnREIuIEkgdXNlZCBubyBjb2xsYXBzZSB0byByZW1hcCBnZW5lIHN5bWJvbHMgdG8gYXZvaWQgY29uZnVzaW9uLiAyMDAgbWF4IGdlbmUgc2l6ZSBhbmQgMTUgbWluIGdlbmUgc2l6ZSB0byBoYXZlIG1vcmUgc3RyaW5nZW50IHZhbHVlcy4gSSB1c2VkIDEwMDAgcGVybXV0YXRpb25zIHRoYXQgYWxsb3dlZCBmb3IgYSBzaG9ydGVyIHJ1bm5pbmcgdGltZS4gVGhlcmVmb3JlLCBHU0VBIHJlc3VsdGVkIGluIG1vcmUgc3RyaW5nZW50IG5vbi1FTVQgdmFsdWVzIHRoYXQgYXJlIHNob3duIHRvIGJlIGVucmljaGVkLiBUaGVyZSBhcmUgcGF0aHdheXMgb2YgZ2VuZXMgdGhhdCBhcmUga25vd24gdG8gYmUgaW52b2x2ZWQgaW4gYXBvcHRvc2lzLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UsIHdpdGggbXkgcHJldmlvdXMgcmVzdWx0cyB0aGF0IG15IGxvZyBDUE0gaXMgYWx3YXlzIG5lZ2F0aXZlLCB0aGVyZSBhcmUgbm8gcG9zaXRpdmUgbG9nIENQTSB2YWx1ZXMuIFRoaXMgd2FzIG15IHByZXZpb3VzIGh5cG90aGVzaXMgdGhhdCBhbG1vc3QgZXZlcnkgZ2VuZSB0cmVhdGVkIHNob3dlZCBoaWdoZXIgZXhwcmVzc2lvbiB3aXRoIHRoZSB0cmVhdG1lbnRzIHRoZSBhdXRob3JzIGRpZCB0byBpbmR1Y2Ugb25jb2dlbmljIHJvbGVzLiAKCgpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9tYWMvRGVza3RvcC9CQ0I0MjAvQTNfTWV0eXVNZWxrb255YW4vaW1hZ2VzL2VucmljaG1lbnQucG5nIikKYGBgCgoqKkZpZ3VyZSAyIEdTRUEgRW5yaWNobWVudCBSZXN1bHRzOioqIEdTRSByZXN1bHRzIGluZGljYXRlIHRoZXJlIGFyZSA0NzAzIHVwcmVndWxhdGVkIGdlbmUgc2V0cyBhbmQgMzggZG93biByZWd1bGF0ZWQgZ2VuZSBzZXRzLgoKIyMjIyBVcHJlZ3VsYXRlZAoqIDEyIGdlbmUgc2V0cyA8IDI1JSBGRFIKKiA4NSBnZW5lIHNldHMgPCAxJSBwLXZhbHVlCiogMzA0IGdlbmUgc2V0cyA8IDUlIG5vbWluYWwgcC12YWx1ZQoKIyMjIyBEb3ducmVndWxhdGVkCiogNCBnZW5lIHNldHMgPCAyNSAlIEZEUgoqIDkgZ2VuZSBzZXRzIDwgMSUgcC12YWx1ZQoqIDkgZ2VuZSBzZXRzIDwgNSUgcC12YWx1ZQoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9uZWcucG5nIikKYGBgCgoqKkZpZ3VyZSAzIE5lZ2F0aXZlIEVucmljaG1lbnQgUmVzdWx0czoqKiBUaGUgdG9wIGdlbmUgc2V0IGZvciBuZWdhdGl2ZSBpcyBQSE9TUEhPTElQQVNFUyVIVU1BTkNZQyVMSVBBU1lOLVBXWSB3aXRoIDAgRkRSIGFuZCAwIHAtdmFsdWUgYW5kLTAuNjUgRVMuCgpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9tYWMvRGVza3RvcC9CQ0I0MjAvQTNfTWV0eXVNZWxrb255YW4vaW1hZ2VzL3Bvcy5wbmciKQpgYGAKCioqRmlndXJlIDQgUG9zaXRpdmUgRW5yaWNobWVudCBSZXN1bHRzOioqIFRoZSB0b3AgZ2VuZSBzZXQgYXQgdGhlIHBvc2l0aXZlIGdlbmUgc2V0IGlzIFRSQU5TQ1JJUFRJT05BTCBSRUdVTEFUSU9OIEJZIFNNQUxMIFJOQVMlUkVBQ1RPTUUlUi1IU0EtNTU3ODc0OS4zIHdpdGggMC43ODQgRkRSLXZhbHVlIGFuZCAwLjAwMSBOb21pbmFsIHAtdmFsdWVzIGFuZCAwLjk4IEVTIHNjb3JlLiAKCiMjIyBDb21wYXJpc29uIG9mIFRocmVzaG9sZGVkIHZzIG5vbi1UaHJlc2hvbGRlZAoKVGhlcmUgYXJlIHBhdGh3YXlzIG9mIGdlbmVzIHRoYXQgYXJlIGtub3duIHRvIGJlIGludm9sdmVkIGluIGFwb3B0b3Npcy4gVGhpcyBtYWtlcyBzZW5zZSBiZWNhdXNlLCB3aXRoIG15IHByZXZpb3VzIHJlc3VsdHMgdGhhdCBteSBsb2cgQ1BNIGlzIGFsd2F5cyBuZWdhdGl2ZSwgdGhlcmUgYXJlIG5vIHBvc2l0aXZlIGxvZyBDUE0gdmFsdWVzLiBUaGlzIHdhcyBteSBwcmV2aW91cyBoeXBvdGhlc2lzIHRoYXQgYWxtb3N0IGV2ZXJ5IGdlbmUgdHJlYXRlZCBzaG93ZWQgaGlnaGVyIGV4cHJlc3Npb24gd2l0aCB0aGUgdHJlYXRtZW50cyB0aGUgYXV0aG9ycyBkaWQgdG8gaW5kdWNlIG9uY29nZW5pYyByb2xlcy4gCgpNb3N0IG9mIHRoZSBwYXRod2F5cyBhcmUgdmlyYWwgaW5mZWN0aW9uIHBhdGh3YXlzLiBGdXJ0aGVybW9yZSwgc29tZSB2aXJ1c2VzIHN0aW11bGF0ZSBwYW5jcmVhcyBjYW5jZXIgYW5kIGxpdmVyIGNhbmNlciBhcyB3ZWxsIHN1Y2ggYXMgY2hyb25pYyBIZXBhdGl0aXMgQyBhbmQgY2hyb25pYyBIZXBhdGl0aXMgQiAoNikgQSBzaWduaWZpY2FudCBwcm9wb3J0aW9uIG9mIHRoZXNlIHBhdGh3YXlzIGFyZSBzeXN0ZW1hdGljIGRpc2Vhc2UtY2F1c2luZyB2aXJ1c2VzIHN1Y2ggYXMgRXBzdGVpbiBCYXJyIHZpcnVzIGFuZCBISVYtMSB2aXJ1cy4gVGhlIG5lZ2F0aXZlIHJlc3VsdHMgY29udGFpbiBtb3JlIG9uY29nZW5pYyBwYXRod2F5cyBzdWNoIHRoYXQgdGhlIGFwb3B0b3NpcyBhbmQgc2lhbGljIGFjaWQgc3ludGhlc2lzIGdlbmUgc2V0cyBhcmUgbW9yZSBwcmV2YWxlbnQgYXMgb3Bwb3NlZCB0byBwb3NpdGl2ZS4gVGhlcmUgaXMgdGhlIHNlcGFyYXRpb24gb2Ygb25jb2dlbmljIHBhdGh3YXlzIGJldHdlZW4gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlLiBUaGUgc2Vjb25kIGFzc2lnbm1lbnQgZ2VuZSBlbnJpY2htZW50IHJlc3VsdHMgd2VyZSBtb3JlIGNsZWFyIGluIHRlcm1zIG9mIGdlbmUgcGF0aHdheSByb2xlLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIEVNVCBnZW5lcyB2cyBub24tRU1UIGdlbmVzIGlzIG1vcmUgYXBwYXJlbnQgaW4gdGhlIHRocmVzaG9sZGVkIGFuYWx5c2lzLiB0aGUgZ2VuZSBlbnJpY2htZW50IHJlc3VsdHMgaW4gdGhlIG5vbi10aHJlc2hvbGRlZCBhbmFseXNpcyBhcmUgbW9yZSBzY2FyY2UgYW5kIGRvIG5vdCBnaXZlIHNpZ25pZmljYW50bHkgZW5yaWNoZWQgcmVzdWx0cy4gRXZlbiB0aG91Z2ggbXkgcGFyYW1ldGVycyBhcmUgc3RyaW5nZW50LCBJIGFtIG5vdCBnZXR0aW5nIHBhdGh3YXlzIHRoYXQgYXJlIGFkZXF1YXRlIGluIHRlcm1zIG9mIHRoZWlyIHJvbGUuCgpGaW5hbGx5LCB0aGUgcXVhbnRpdGF0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdGhyZXNob2xkZWQgYW5kIHRoZSBub24tdGhyZXNob2xkZWQgaXMgdGhlIHRoZSB0aHJlc2hvbGRlZCBhbmFseXNpcyBoYXMgNzcxIGRvd25yZWd1bGF0ZWQgZ2VuZXMgc2V0cyB0aGF0IGFyZSBsZXNzIHRoYW4gMC4wMDEgcCB2YWx1ZSBhbmQgdGhlcmUgYXJlIDExMjggdXByZWd1bGF0ZWQgZ2VuZSBzZXRzLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vbi10aHJlaG9sZGVkIGFuZCB0aHJlc2hvbGRlZCBpcyBoaWdoIGFzIDQ3MDMgdXByZWd1YWx0ZWQgZ2VuZXMgKG5vbi10aHJlc2hvbGRlZCkgLSAxMTI4IHVwcmVndWxhdGVkIGdlbmVzICh0aHJlc2hvbGRlZCkgPSAzNTc1IGdlbmUgc2V0cy4gVGhlIGRvd25yZWd1YWx0ZWQgZ2VuZSBzZXQgZGlmZmVyZW5jZSBpcyBtb3JlIHN1YnN0YW50aWFsICg3MzMpIGdlbmVzZXRzIG1vcmUgaW4gdGhyZXNob2xkZWQgYW5hbHlzaXMuIAoKCiMjIFBhcnQgMjogVmlzdWFsaXplIHlvdXIgR2VuZSBzZXQgRW5yaWNobWVudCBBbmFseXNpcyBpbiBDeXRvc2NhcGUKCmBgYHtyfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL21hYy9EZXNrdG9wL0JDQjQyMC9BM19NZXR5dU1lbGtvbnlhbi9pbWFnZXMvcGF0aHdheS5wbmciKQpgYGAKCioqRmlndXJlIDUgUHJlbGltaW5hcnkgQ3l0b3NjYXBlIFBhdGh3YXkgRW5yaWNobWVudCBWaXN1YWxpemF0aW9uOioqIEJvdGggYXBvcHRvdGljIGFuZCB2aXJhbCBnZW5lIHNldCBhcmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlci4gTWVzZW5jaHltYWwgYXBvcHRvdGljIGdlbmUgc2V0cyBhcmUgYXBwYXJlbnQuIEJvdGggdXByZWd1YWx0ZWQgKFJlZCkgYW5kIGRvd25yZWd1YWx0ZWQgKEJsdWUpIGdlbmUgc2V0cyBhcmUgb2JzZXJ2ZWQuIFRoaXMgaW5jbHVkZXMgdGhlIHdob2xlIGVucmljaG1lbnQgbWFwLgoKVGhlIGVucmljaG1lbnQgbWFwIEN5dG9zY2FwZSB2aXN1YWxpemF0aW9uIHdhcyBkb25lIGJ5IHVzaW5nIHN0cmluZ2VudCAwLjA1IHAtdmFsdWUgYW5kIHZlciBwZXJtaXNzaXZlIDAuNSBGRFIgdmFsdWVzICg3KSBUaGUgcmVhc29uIHdoeSBJIHVzZWQgMC41IGZvciBGRFIgaXMgdGhhdC4gRnVydGhlcm1vcmUsIEphY2NhcmQgKyBPdmVybGFwIGNvZWZmaWNpZW50IDAuMzc1IGFuZCBjb21iaW5lZCBjb2VmZmljaWVudCAwLjUgd2VyZSB1c2VkLiBJbiB0b3RhbCB0aGVyZSBhcmUgMjkxIG5vZGVzIChpbmNsdWRpbmcgaGlkZGVuKSBhbmQgNzYzIGVkZ2VzIChpbmNsdWRpbmcgaGlkZGVuIGVkZ2VzKSBpbiB0aGUgdmlzdWFsaXphdGlvbi4gVGhlcmUgYXJlIG1vcmUgZ2VuZSBzZXRzIHRoYXQgSSBmaW5kIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG90aGVyLgoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9wdWJsaWNhdGlvbi5wbmciKQpgYGAKCioqRmlndXJlIDYgUHVibGljYXRpb24gUmVhZHkgQW5ub3RhdGlvbiBGaWd1cmUgb2YgR2VuZSBFbnJpY2htZW50IHZpc3VhbGl6YXRpb24gKDcpKio6IEJ5IGFubm90YXRpbmcgYW5kIGFuYWx5emluZyBpbiB0ZXJtcyBvZiBwb3NpdGl2aXR5IGFuZCBuZWdhdGl2aXR5IHRoZSBlbnJpY2htZW50IHZpc3VhbGl6YXRpb24gc2hvd2VkIHVwIHJlZ3VsYXRlZCBnZW5lIHNldHMgdG8gYmUgY29sbGFwc2VkIGluIHZpcmFsIGV4cG9ydCBSTkEgdGhlbWUuIE1vc3Qgb2YgdGhlIGRvd24gcmVndWxhdGVkIGFyZSBub3QgYXNzb2NpYXRlZCB3aXRoIG9uZSBhbm90aGVyLgoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9wYXJhbWV0ZXJzLnBuZyIpCmBgYAoKKipGaWd1cmUgNyBBbm5vdGF0aW9uIHBhcmFtZXRlcnMqKjogVGhlIERlZmF1bHQgcGFyYW1ldGVycyBhcmUgdXNlZCBkdWUgdG8gc21hbGwgdmlzdWFsaXphdGlvbiBhbmQgZm9yIHByb3BlciBvYnNlcnZhdGlvbi4gVGhlIGFubm90YXRpb25zIGZpdCB0aGUgbW9kZWwgYXMgdGhlcmUgaXMgc3Ryb25nIGV2aWRlbmNlIG9mIHRoZSBwcmV2aW91cyBjb25uZWN0aW9ucyBhbW9uZyBjYW5jZXIgYW5kIHZpcmFsIGdlbmVzIGluZGljYXRlZC4KCmBgYHtyfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL21hYy9EZXNrdG9wL0JDQjQyMC9BM19NZXR5dU1lbGtvbnlhbi9pbWFnZXMvY2x1c3Rlci5wbmciKQpgYGAKCioqRmlndXJlIDggKEV4dHJhISlQdWJsaWNhdGlvbiByZWFkeSBmaWd1cmUgb2YgR2VuZSBFbnJpY2htZW50IHZpc3VhbGl6YXRpb24qKjogQ29sbGFwc2VkIHRoZW1lcyBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIGluZGVlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBhYm9ydGl2ZSB2aXJhbCBSTkEgZ2VuZSBzZXRzIGFuZCB0aGUgZXhwb3J0IHZpcmFsIFJOQSBnZW5lIHNldC4KCkFwb3B0b3RpYyBnZW5lIHNldHMgYXJlIHJlbGF0ZWQgdG8gdGhvc2Ugb2YgdmlyYWwgaW5mZWN0aW9uIGdlbmUgc2V0cy4gVGhpcyBzdXBwb3J0cyB0aGUgcHJlc2VuY2Ugb2YgdmlyYWwgZWZmZWN0cyBvbiBwYW5jcmVhcyBjYW5jZXIgYXMgd2VsbCBhcyBtYW55IG90aGVyIGNhbmNlciB0eXBlcy4gSSBjcmVhdGVkIHRoZSBwdWJsaWNhdGlvbi1yZWFkeSBmaWd1cmUgYnkgdXNpbmcgZGVmYXVsdCBwYXJhbWV0ZXJzIG9mIE1DTCBjbHVzdGVyIDMgbWF4IHdvcmQgcGVyIGxhYmVsLCBtaW5pbXVtIHdvcmQgb2NjdXJyZW5jZSBvZiAxLCBhbmQgYWRqYWNlbnQgd29yZCBib251cyBvZiA4IHdpdGggV29yZENsb3VkIGxhYmVsIGFsZ29yaXRobS4gQnkgY29sbGFwc2luZyB0aGUgZW5yaWNobWVudCBtYXAgSSBmb3VuZCAyNCBtYWpvciB0aGVtZXMgb24gbXkgbWFwLiBJIGRvIG5vdCBvYnNlcnZlIGFueSBub3ZlbCBwYXRod2F5cyB0aGF0IGFwcGVhcmVkIGFmdGVyIHRvdGFsIGNvbGxhcHNpbmcuIAoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9zYXBpZW5zLnBuZyIpCgpgYGAKCioqRmlndXJlIDkgKEV4dHJhISkgR2VuZU1hbmlhIGdlbmUgZW5yaWNobWVudCBwYXRod2F5IHJlc3VsdHMuIE1vc3Qgb2YgdGhlIGdlbmVzIGFyZSB2aXJ1cyByZWxhdGVkKDgpKioKCjxicj4gVGhlIGNvbXBsZXRlIGdlbmUgc2V0IEdlbmVNYW5pYSBhbmFseXNpcyB0byBzZWUgaWYgdGhlIGdlbmVzIGluIHRoZSByZXNwZWN0aXZlIHBhdGh3YXlzIG9uIHRoZSBlbnJpY2htZW50IG1hcCBhcmUgYXNzb2NpYXRlZC4gSSBub3RlZCB2aXJhbCBnZW5lcyBtb3N0bHkuIFRoZSBub3RlZCBub2RlIHR5cGVzCgpgYGB7cn0KIEdlbmVtYW5pYSA8LSByZWFkLmNzdihmaWxlPWZpbGUucGF0aChnZXR3ZCgpLCJkYXRhIiwidGFibGVfZ2VuZW1hbmlhLmNzdiIpKQprbml0cjo6a2FibGUoR2VuZW1hbmlhLCB0eXBlPSJodG1sIikKYGBgCgojIyBQYXJ0IDM6IFBvc3QgQW5hbHlzaXMgU3VtbWFyeQpgYGB7cn0KbGlicmFyeShHU0EpCmdtdF9maWxlIDwtIGZpbGUucGF0aChnZXR3ZCgpLCJkYXRhIiwKICAiSHVtYW5fR09CUF9BbGxQYXRod2F5c19ub19HT19pZWFfTWFyY2hfMDFfMjAyMV9zeW1ib2wuZ210IikKY2FwdHVyZS5vdXRwdXQoZ2VuZXNldHMgPC0KR1NBLnJlYWQuZ210KGdtdF9maWxlKSxmaWxlPSJHU0FfZmlsZS50eHQiKQpuYW1lcyhnZW5lc2V0cyRnZW5lc2V0cykgPC0gZ2VuZXNldHMkZ2VuZXNldC5uYW1lcwprbml0cjo6a2FibGUoaGVhZChnZW5lc2V0cyRnZW5lc2V0Lm5hbWVzKSwgdHlwZT0iaHRtbCIpCgpgYGAKCmBgYHtyfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL21hYy9EZXNrdG9wL0JDQjQyMC9BM19NZXR5dU1lbGtvbnlhbi9pbWFnZXMvcDUzLnBuZyIpCmBgYAoKKipGaWd1cmUgMTAgKEV4dHJhISkgU2lnbmF0dXJlIGdlbmUgc2V0IHA1MyBhZ2FpbnN0IGFsbCBnZW5lIHNldHMgZW5yaWNoZWQ6KiogUG9zdCBhbmFseXNpcyBjb2VmZmljaWVudCBvZiAwLjI1IE1hbm4tV2hpdG5leSBjdXQtb2ZmIChUd28tc2lkZWQpIHdhcyB1c2VkLiBQb3N0LWFuYWx5c2lzIHJlc3VsdHMgYWxzbyBzaG93IHRoYXQgcDYzIGlzIG1haW5seSBpbnZvbHZlZCBpbiByZWFjdGl2ZSBveHlnZW4gc3BlY2llcyAoUk9TKSBtZXRhYm9saXNtLiBST1MgYXJlIGtub3duIHRvIGJlIHR1bW91ciBncm93dGggcHJvbW90ZXJzIHdoaWNoIHRoZW4gY2F1c2UgRU1UIGluIGRpZmZlcmVudCBodW1hbiB0aXNzdWVzIGFzIHdlbGwgYXMgdHJpZ2dlciBjYW5jZXIgb2YgZGlmZmVyZW50IHR5cGUuCgoKPGJyPiBUaGUgcG9zdCBhbmFseXNpcyBpbmNsdWRlcyB0aGUgc2lnbmF0dXJlIGdlbmUgc2V0IGZyb20gQmFkZXIgZ2VuZSBzZXRzICg1KSAgb2YgSHVtYW4gc3ltYm9scyBvZiBEcnVnYmFuayBhcHByb3ZlZCBnZW5lIHNldC4gcDUzIGlzIGFuIG9uY29nZW5lIGFuZCBpdCBpcyBpbnZvbHZlZCBpbiBtYW55IHBhdGh3YXlzIHRoYXQgYXJlIGtub3duIHRvIGJlIGNhdXNpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGNhbmNlcnMuIFA1MyBpcyBhc3NvY2lhdGVkIHdpdGggdmlyYWwgcGF0aHdheXMgYXMgd2VsbCBhcyBzb21lIG9uY29nZW5pYyBwYXRod2F5cy4gVGhlcmVmb3JlLCBpdCBpcyBzYWZlIHRvIGFzc3VtZSB0aGF0IHRoZSB2aXJhbCBlZmZlY3Qgb24gb25jb2dlbmljIGdlbmVzIGZvciB0cmlnZ2VyaW5nIHR1bW91cnMgaXMgaW5kZWVkIHRydWUuIAoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9OQU5TLnBuZyIpCmBgYAoKCioqRmlndXJlIDExIE5BTlMgKGVuY2lyY2xlZCByZWQpIFNpYWxpYyBBY2lkIHBhdGh3YXkgb2YgSG9tbyBzYXBpZW5zKDExKSoqCgoKVGhlIHNpYWxpYyBhY2lkIHBhdGh3YXkgaXMgb25lIG9mIHRoZSBwYXRod2F5cyB0aGF0IGlzIGtub3duIHRvIGJlIGFmZmVjdGluZyB0dW1vciBwcm9saWZlcmF0aW9uLCBjZWxsIGdyb3d0aCwgY2VsbCBkZXRhY2htZW50IGFuZCBhcyBhIHJlc3VsdCBtZXRhc3Rhc2lzLiBJdCBpcyBrbm93biB0byBiZSBoaWdobHkgZXhwcmVzc2VkIGJ5IHRoZSBjYW5jZXIgY2VsbC4gTW9yZW92ZXIsIGNhbmNlci10cmlnZ2VyZWQgYXBvcHRvc2lzIGlzIG9uZSBvZiB0aGUgcmVzdWx0cyBvZiBzaWFsaWMgYWNpZC4gTmV1NUFjIDktcGhvc3BoYXRlIHN5bnRoYXNlIChOQU5TKSggZW5jaXJjbGVkIHJlZCkgaXMgYW4gZW56eW1lIGluIHNpYWxpYyBhY2lkIG1ldGFib2xpc20uTkFOUycgcm9sZSBpbiBzaWFsaWMgYWNpZCBwYXRod2F5cyBvbiB0aGUgZmlndXJlLiBBbHNvLCBnbHljb2xpcGlkLWJvdW5kIHNpYWxpYyBhY2lkcyBhcmUgaGlnaGx5IGZvdW5kIGluIGNhbmNlciBjZWxscy4gRmluYWxseSwgYnkgaGF2aW5nIGhpZ2ggZXhwcmVzc2lvbiBsZXZlbHMgYW5kIHZpc3VhbGl6ZWQgb24gdGhlIHBhdGh3YXkgYW5hbHlzaXMgTkFOUyBoYXMgdGhlIHBvdGVudGlhbCB0byBiZSBhbiBvbmNvZ2VuZS4gVGhlIHJvbGUgb2Ygc2lhbGljIGFjaWQgZGlmZmVycyBhcyB0aGVyZSBpcyBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIGNhbmNlciBnZW5lcyBhbmQgdGhlIHZpcmFsIGdlbmVzLCBJIGRvIGh5cG90aGVzaXplIHRoYXQgY2FuY2VyIGNhdXNpbmcgdmlydXNlcyBhcmUgYW4gaW1wb3J0YW50IGZhY3RvciBpbiBoaWdoIHNpYWxpYyBhY2lkIGxldmVscyBpbiBwYW5jcmVhcyBjYW5jZXIuCgpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9tYWMvRGVza3RvcC9CQ0I0MjAvQTNfTWV0eXVNZWxrb255YW4vaW1hZ2VzL3NpYWxpY2FjaWQuanBnIikKYGBgCgoqKkZpZ3VyZSAxMiBPbmNvZ2VuaWMgcm9sZSBvZiBTaWFsaWMgYWNpZCBNZXRhYm9saXNtICgxMCkqKgoKIyMgUGFydCA0OiBJbnRlcnByZXRhdGlvbiBhbmQgZGV0YWlsZWQgdmlldyBvZiByZXN1bHRzCgoxLkRvIHRoZSBlbnJpY2htZW50IHJlc3VsdHMgc3VwcG9ydCBjb25jbHVzaW9ucyBvciBtZWNoYW5pc20gZGlzY3Vzc2VkIGluIHRoZSBvcmlnaW5hbCBwYXBlcj8gSG93IGRvIHRoZXNlIHJlc3VsdHMgZGlmZmVyIGZyb20gdGhlIHJlc3VsdHMgeW91IGdvdCBmcm9tIEFzc2lnbm1lbnQgMiB0aHJlc2hvbGRlZCBtZXRob2RzID8KCiAgWWVzLCB0aGUgZW5yaWNobWVudCByZXN1bHRzIHN1cHBvcnQgdGhlIGNvbmNsdXNpb24uIEl0IG5vdCBvbmx5IHN1cHBvcnRzIHRoZSBjb25jbHVzaW9uIG9mIEVNVCBnZW5lcyB0aGF0IGFyZSBrbm93biB0byBiZSB1bnJlZ3VsYXRlZCBhbmQgZm91bmQgb24gdGhlIHBvc2l0aXZlIHNpZGUgb2YgdGhlIGdlbmUgZW5yaWNobWVudCBhbmFseXNpcyBidXQgYWxzbyBhIGZpbmRpbmcgb2YgdmlyYWwgZWZmZWN0LiBUaGlzIHZpcmFsIGVmZmVjdCBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgY2FuY2VyIGhhcyBiZWVuIGRpc2N1c3NlZCBpbiBkaWZmZXJlbnQgbGl0ZXJhdHVyZS4gSG93ZXZlciwgdGhlIGNhbmNlciBvbmNvZ2VuZSBwNTMgaGFzIGEgcmVsYXRpb25zaGlwIHdpdGggb25jb2dlbmljIHZpcmFsIGNhbmNlci1pbmR1Y2luZyBnZW5lcy4gRnVydGhlciByZXNlYXJjaCBpcyByZXF1aXJlZCB0byBpbGx1c3RyYXRlIGJvdGggcGFuY3JlYXMgY2FuY2VyIGFuZCBtdWNoIG90aGVyIGNhbmNlci4gVGhlIHJlc3VsdHMgdGhhdCB3ZSBvYnRhaW5lZCBmcm9tIHRoZSB0aHJlc2hvbGRlZCBhbmFseXNpcyBhcmUgcGFydGx5IGRpZmZlcmVudCBmcm9tIHdoYXQgd2Ugb2J0YWluZWQgZnJvbSB0aGUgbm9uLXRocmVzaG9sZGVkIGFuYWx5c2lzLiBJIGFtIGNvbmZpZGVudCB0aGF0IHRoaXMgaXMgZHVlIHRvIHRoZSBnZW5lLXNldCBkaWZmZXJlbmNlIGFzIHdlbGwgYXMgZXhwZXJpbWVudGFsIGVycm9ycyBpbiBkYXRhIGFuYWx5c2lzLiBIb3dldmVyLCB3ZSB3ZXJlIGx1Y2t5IHRvIGdldCBwYXJ0aWFsIHBvc2l0aXZlIHJlc3VsdHMgYW5kIGNvbmNsdWRlIHNpbWlsYXJseSB0byB0aGUgbWFpbiBwYXBlcidzIGNvbmNsdXNpb24uCgoyLkNhbiB5b3UgZmluZCBldmlkZW5jZSwgaS5lLiBwdWJsaWNhdGlvbnMsIHRvIHN1cHBvcnQgc29tZSBvZiB0aGUgcmVzdWx0cyB0aGF0IHlvdSBzZWUuIEhvdyBkb2VzIHRoaXMgZXZpZGVuY2Ugc3VwcG9ydCB5b3VyIHJlc3VsdCA/CiAgCig5KSBkaXNjdXNzZXMgcDUzIG1hbmlwdWxhdGlvbiBieSBvbmNvZ2VuaWMgdmlydXNlcyBhbmQgc2hvd3MgYSBjbGVhciBwaWN0dXJlIG9mIHBvc3NpYmxlIG5vbi1vbmNvZ2VuaWMgdmlydXNlcy4gbXkgYW5hbHlzaXMgcmVzdWx0cyBzaG93ZWQgY2xlYXIgaW5kaWNhdGlvbnMgb2YgSElWLCBFMWIoRWJzdGVpbiBCYXJyIHZpcnVzKSBlZmZlY3Qgb24gY2VsbCBhcG9wdG9zaXMuIEFsc28sIGNlbGx1bGFyIGRlZ3JhZGF0aW9uIHBhdGh3YXlzIGFyZSBwYXJ0aWFsbHkgdmlzdWFsaXplZCBvbiBteSBlbnJpY2htZW50IG1hcC4gVGhleSBhcmUgYWxzbyBhc3NvY2lhdGVkIHdpdGggdmlyYWwgbWV0YWJvbGljIGFjdGl2aXR5IHN1Y2ggYXMgSElWIChzaG93biBvbiB0aGUgZGVncmFkYXRpb24gc2lkZSkoOSkKVmlyYWwgYWN0aXZpdHkgaXMgdGhlbiBhc3NvY2FpdGVkIHdpdGggc2lhbGljIGFjaWQgYXMgdGhpcyBwYXBlciBkaXNjdXNzZXMgYW5kIG1lbnRpb25zIHRoZSB2aXJ1cyBlZmZlY3Qgb24gY2FuY2VyICgxMikKCiMjIyMgQ29uY2x1c2lvbgoKSW4gdGhlIHRoaXJkIHBhcnQgb2YgdGhlIGFzc2lnbm1lbnQgdGhlIHBvc3QtYW5hbHlzaXMgb2YgdGhlIEdTRUEgcmVzdWx0cyBhbGxvd2VkIHRvIHNlZSB0aGUgZGlyZWN0IGludGVyYWN0aW9uIGJldHdlZW4gZGlmZmVyZW50IHZpcmFsIGNhbmNlcm91cyBnZW5lcy4gVGhpcyBwYXZlcyBhIHBhdGggZm9yIGZ1cnRoZXIgcmVzZWFyY2ggaW4gdmlyYWwgZWZmZWN0IG9uIHRoZSBwYW5jcmVhcyBjYW5jZXIsIGJ5IHN0cmVuZ3RoZW5pbmcgdGhlIGNvbmNsdXNpb24gdGhhdCB0aGUgYXV0aG9ycyBtYWRlLiBUaGUgcmVzdWx0cyBmcm9tIGc6UHJvZmlsZSBhbmQgdGhlIEdTRUEgY29ycmVsYXRlIGluIGEgd2F5IHRoYXQgYm90aCBvZiB0aGVzZSBhbmFseXNpcyBkbyBoYXZlIHNpbWlsYXIgbnVtYmVycyBvZiBnZW5lcyBsb3dlciB0aGFuIDElIHAtdmFsdWUuIFRoaXMgbWFrZXMgc2Vuc2UgYmVjYXVzZSBib3RoIG9mIHRoZXNlIGFuYWx5c2lzIGluZGljYXRlIHRoZSBjb25jbHVzaW9uIG9mIGhpZGRlbiB2aXJhbCBnZW5lcyB0aGF0IHRoZSBhdXRob3IgZGlkIG5vdCBzaG93IGluIHRoZWlyIGFuYWx5c2lzLgoKYGBge3J9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvbWFjL0Rlc2t0b3AvQkNCNDIwL0EzX01ldHl1TWVsa29ueWFuL2ltYWdlcy9jYW5jZXIuanBlZyIpCmBgYAoKKipGaWd1cmUgMTM6IE9uY29nZW5pYyByb2xlIG9mIFNpYWxpYyBhY2lkIE1ldGFib2xpc20oOSkqKgoKCgojIyBSZWZlcmVuY2U=